package dirfile

import (
	"log"
	"os"
	"syscall"
)

// 独占式的打开文件，避免其他进程覆盖
func GetFileExclusive(filePath string) (*os.File, error) {
	file, err := os.OpenFile(filePath, os.O_RDWR, 0644)
	if err != nil {
		log.Println("Error opening file:", err)
		return nil, err
	}

	// 尝试获取排他锁
	if err := lockFile(file); err != nil {
		log.Println("Error locking file:", err)
		return nil, err
	}

	return file, nil
}

func ReleaseFileExclusive(file *os.File) {
	file.Close()
	unlockFile(file)
}

func lockFile(file *os.File) error {
	return syscall.Flock(int(file.Fd()), syscall.LOCK_EX)
}

func unlockFile(file *os.File) error {
	return syscall.Flock(int(file.Fd()), syscall.LOCK_UN)
}
